import pandas as pd

pd.read_excel("user_fit.xlsx").head()
pd.read_excel("user_prediction.xlsx").head()
'''
模型实现
scikit-learn
高斯分布朴素贝叶斯分类器 naive_bayes.GaussianNB
多项式分布朴素贝叶斯分类器 naive_bayes.MultinomialNB
伯努利分布朴素贝叶斯分类器 naive_bayes.BernoulliNB
'''
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB

# 使用 Pandas 读取数据
df_fit = pd.read_excel("user_fit.xlsx", header=0)
# 特征
X = df_fit.iloc[:, 0:8]
# 目标
y = df_fit['用户是否为会员']
# 安装 3:7 切分验证集和训练集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# 构建高斯贝叶斯分类器
model_GaussianNB = GaussianNB()
# 使用训练集训练模型
model_GaussianNB.fit(X_train, y_train)
# 使用验证集评估准确度
model_GaussianNB.score(X_test, y_test)

import joblib

model_GaussianNB.fit(X, y)
# 保存模型
joblib.dump(model_GaussianNB, 'model_GaussianNB.pkl')

# 使用该模型去评估 user_prediction.xlsx 非会员数据集中，潜在会员用户的概率。
# 使用 Pandas 读取数据
df_pred = pd.read_excel("user_prediction.xlsx", header=0)
# 特征
X_pred = df_pred.iloc[:, 0:8]
# 加载模型
model_GaussianNB = joblib.load('model_GaussianNB.pkl')
# 返回预测概率（%）
results = model_GaussianNB.predict_proba(X_pred) * 100
import numpy as np

# 将预测概率转换为 DataFrame
results_df = pd.DataFrame(np.around(results, 2), columns=['非会员概率', '会员概率'])
# 将预测概率添加到原数据集中最后一列
df_merged = pd.concat(
    [df_pred.drop("用户是否为会员", axis=1), results_df['会员概率']], axis=1)
df_merged.sort_values(by="会员概率", ascending=False)

# 将预测概率转换为 DataFrame
results_df = pd.DataFrame(np.around(results, 2), columns=['非会员概率', '会员概率'])
# 将预测概率添加到原数据集中最后一列
df_merged = pd.concat(
    [df_pred.drop("用户是否为会员", axis=1), results_df['会员概率']], axis=1)
print(df_merged.sort_values(by="会员概率", ascending=False))
